package com.qhx.backme.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import com.qhx.backme.exception.SupplyChainException;
import com.qhx.backme.model.Result;
import com.qhx.backme.model.to.LoginTO;
import com.qhx.backme.model.to.RegisterTO;
import com.qhx.backme.model.vo.ResultVO;
import com.qhx.backme.service.OrgService;
import com.qhx.backme.util.HttpUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 组织服务实现类，提供登录和注册功能
 * @author: qhx20040819
 * @date: 2023-10-23 18:57
 **/
@Service
public class OrgServiceImpl implements OrgService
{

    // 注入HttpUtil工具类，用于发送HTTP请求
    @Autowired
    private HttpUtil httpUtil;

    /**
     * 登录功能实现
     * 根据组织类型调用不同的智能合约函数获取组织信息
     * @param loginTO 登录传输对象，包含地址和组织类型
     * @return 登录结果，包含成功或错误信息
     */
    @Override
    public Result<String> login(LoginTO loginTO)
    {
        // 检查登录参数是否为空
        String address = loginTO.getAddress();
        Integer orgType = loginTO.getOrgType();
        if (StrUtil.isEmpty(address) || Objects.isNull(orgType))
        {
            throw new SupplyChainException(ResultVO.PARAM_EMPTY);
        }

        // 根据组织类型选择对应的智能合约函数
        String funName = null;
        if (orgType == 1)
        {
            funName = "getCompany";
        } else
        {
            funName = "getBank";
        }
        // 准备函数调用参数
        List params = new ArrayList<>();
        params.add(address);

        // 发送HTTP请求调用智能合约函数
        JSONArray call = httpUtil.call(address, funName, params);
        // 根据返回结果判断登录是否成功
        if (StrUtil.isEmpty(call.getStr(0)))
        {
            return Result.error("登录失败");
        }
        // 返回登录成功信息
        String mes = orgType == 1 ? "公司登录成功" : "银行登录成功";
        return Result.success(mes);

    }

    /**
     * 注册功能实现
     * 根据组织类型调用不同的智能合约函数添加新组织
     * @param registerTO 注册传输对象，包含用户名、组织类型和地址
     * @return 注册结果，包含成功或错误信息
     */
    @Override
    public Result<String> register(RegisterTO registerTO)
    {
        // 检查注册参数是否为空
        String username = registerTO.getUsername();
        Integer orgType = registerTO.getOrgType();
        String address = registerTO.getAddress();
        if (StrUtil.isEmpty(address) || Objects.isNull(orgType) || StrUtil.isEmpty(username))
        {
            throw new SupplyChainException(ResultVO.PARAM_EMPTY);
        }

        // 根据组织类型选择对应的智能合约函数
        String funName = null;
        if (orgType == 1)
        {
            funName = "addCompany";
        } else if (orgType == 2)
        {
            funName = "addBank";
        }

        // 准备函数调用参数
        List<Object> params = new ArrayList<>();
        params.add(username);
        params.add(address);
        if (orgType == 2)
        {
            params.add(BigInteger.valueOf(1000L));
        }
        // 发送HTTP请求调用智能合约函数
        String sendTransaction = httpUtil.sendTransaction(funName, params);
        // 根据返回结果判断注册是否成功
        if (StrUtil.isNotEmpty(sendTransaction))
        {
            return Result.error(sendTransaction);
        }
        // 返回注册成功信息
        String mes = orgType == 1 ? "公司注册成功" : "银行注册成功";
        return Result.success(mes);

    }


}
